package br.com.websec.util;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


public class FuncoesUtil {

	public static String replicate(String text, int vezes) {

		StringBuffer ret = new StringBuffer("");

		try {
			for (int i = 0; i < vezes; i++) {
				ret.append(text);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		return ret.toString();

	}
	
	public static boolean contem(char cTexto, String sTexto) {
		boolean bRetorno = false;
		for (int i = 0; i < sTexto.length(); i++) {
			if (cTexto == sTexto.charAt(i)) {
				bRetorno = true;
				break;
			}
		}
		return bRetorno;
	}
	
	public static String DateToStrDate(java.sql.Date d) {

		String ret = "";
		GregorianCalendar cal = new GregorianCalendar();

		int iDia = cal.get(Calendar.DAY_OF_MONTH);
		int iMes = cal.get(Calendar.MONTH) + 1;
		int iAno = cal.get(Calendar.YEAR);

		if (d == null) {
			return ret;
		}

		try {

			cal.setTime(d);

			iDia = cal.get(Calendar.DAY_OF_MONTH);
			iMes = cal.get(Calendar.MONTH) + 1;
			iAno = cal.get(Calendar.YEAR);

			ret = strZero("" + iDia, 2) + "/" + strZero("" + iMes, 2) + "/" + iAno;

		}
		catch (Exception e) {
			e.printStackTrace();
		}

		return ret;

	}
	
	public static String strZero(String text, int times) {

		String ret = null;

		try {
			if (text.length() > times) {
				return text.substring(0, times);
			}
			if (text == null) {
				ret = replicate("0", times);
			}
			else {
				ret = replicate("0", times - text.trim().length());
				ret += text.trim();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}

		return ret;

	}
	
	public static String transValor(String stringValor, int iTamanho, int iDec, boolean bZeroEsquerda) {
		if (stringValor == null) {
			stringValor = "0";
		}
		String sDec = "";
		String sResult = stringValor;
		for (int i = 0; i < stringValor.length(); i++) {
			if (( stringValor.substring(i, i + 1).equals(".") ) | ( stringValor.substring(i, i + 1).equals(",") )) {
				sResult = stringValor.substring(0, i);
				sDec = stringValor.substring(i + 1, stringValor.length());
				if (sDec.length() < iDec) {
					sDec = sDec + replicate("0", iDec - sDec.length());
				}
				else if (sDec.length() > iDec) {
					sDec = sDec.substring(0, iDec);
				}
				break;
			}
		}

		if (( sDec.trim().equals("") ) & ( iDec > 0 )) {
			sDec = replicate("0", iDec);
		}
		if (sResult.length() > ( iTamanho - iDec )) {
			sResult = sResult.substring(sResult.length() - ( iTamanho - iDec ) - 1, ( iTamanho - iDec ));
		}
		if (bZeroEsquerda) {
			if (sResult.length() < ( iTamanho - iDec ))
				sResult = replicate("0", ( iTamanho - iDec ) - sResult.length()) + sResult;
		}

		return sResult + sDec;
	}
	
	
	public static String dateToString( final Date arg, String formato ) throws UtilException {

		String retorno = null;

		try {
			if ( arg != null ) {

				int[] args = FuncoesUtil.decodeDate( arg );
				
				if( ("DDMMAAAA".equals( formato ) ) || ("DDMMAA".equals( formato )) ){
					retorno = FuncoesUtil.strZero( String.valueOf( args[ 2 ] ), 2 ) + FuncoesUtil.strZero( String.valueOf( args[ 1 ] ), 2 );
				} else if ( "AAAAMMDD".equals( formato ) ) {
					retorno = FuncoesUtil.strZero( String.valueOf( args[ 1 ] ), 2 ) + FuncoesUtil.strZero( String.valueOf( args[ 2 ] ), 2 );
				}
			
				if ( "DDMMAAAA".equals( formato ) || formato == null ) {
					retorno = retorno + FuncoesUtil.strZero( String.valueOf( args[ 0 ] ), 4 );
				}
				else if ( "DDMMAA".equals( formato ) ) {
					retorno = retorno + String.valueOf( args[ 0 ] ).substring( 2 );
				}
				else if ( "AAAAMMDD".equals( formato ) ) {
					retorno = FuncoesUtil.strZero( String.valueOf( args[ 0 ] ), 4 ) + retorno;
				}
			}
			else {
				retorno = "00000000";
			}
		} catch ( RuntimeException e ) {
			throw new UtilException( "Erro na função dateToString.\n" + e.getMessage() );
		}

		return retorno;
	}
	
	public static BigDecimal strToBigDecimal( final String arg ) throws UtilException {

		BigDecimal bdReturn = null;

		try {
			if ( arg != null ) {
				StringBuilder value = new StringBuilder();
				char chars[] = arg.trim().toCharArray();
				if ( chars.length >= 3 ) {
					int indexDecimal = ( chars.length - 1 ) - 2;
					for ( int i = 0; i < chars.length; i++ ) {
						value.append( chars[ i ] );
						if ( i == indexDecimal ) {
							value.append( '.' );
						}
					}
					bdReturn = new BigDecimal( value.toString() );
				}
			}
		} catch ( RuntimeException e ) {
			throw new UtilException( "Erro na função strToBigDecimal.\n" + e.getMessage() );
		}

		return bdReturn;
	}
	
	public static int[] decodeDate(java.util.Date dtSel) {
		GregorianCalendar gcSel = new GregorianCalendar();
		int[] iRetorno = { 0, 0, 0 };
		try {
			gcSel.setTime(dtSel);
			iRetorno[0] = gcSel.get(Calendar.YEAR);
			iRetorno[1] = gcSel.get(Calendar.MONTH) + 1;
			iRetorno[2] = gcSel.get(Calendar.DAY_OF_MONTH);
		}
		finally {
			gcSel = null;
		}
		return iRetorno;
	}
	
	public static String adicionaEspacos(String sTexto, int iTamanho) {
		int iTamIni = 0;
		String sRetorno = "";
		if (sTexto == null)
			sTexto = "";
		iTamIni = sTexto.length();
		if (iTamIni > iTamanho) {
			sRetorno = sTexto.substring(0, iTamanho);
		}
		else {
			sRetorno = sTexto;
			for (int i = iTamIni; i < iTamanho; i++) {
				sRetorno = sRetorno + ' ';
			}
		}
		return sRetorno;
	}
	
	public static String limpaStringOld(String str) {

		String sResult = "";
		String sCaracs = "=<>-.,;/\\?";

		if (str != null) {
			for (int i = 0; i < str.length(); i++) {
				if (sCaracs.indexOf(str.substring(i, i + 1)) == -1)
					sResult = sResult + str.substring(i, i + 1);
			}
		}
		return sResult;
	}
	
	public static String limpaAcentos(String sTexto) {
		if ( sTexto == null ){
			return "";
		}
		
		String sRet = "";
		char cVals[] = sTexto.toCharArray();
		
		for (int i = 0; i < cVals.length; i++) {
			cVals[i] = limpaAcento(cVals[i]);
		}
		
		sRet = new String(cVals);
		
		return sRet;
	}
	
	public static char limpaAcento(char cKey) {

		char cTmp = cKey;

		if (contem(cTmp, "ãâáàä"))
			cTmp = 'a';
		else if (contem(cTmp, "ÃÂÁÀÄ"))
			cTmp = 'A';
		else if (contem(cTmp, "êéèë"))
			cTmp = 'e';
		else if (contem(cTmp, "ÊÉÈË"))
			cTmp = 'E';
		else if (contem(cTmp, "îíìï"))
			cTmp = 'i';
		else if (contem(cTmp, "ÎÍÌÏ"))
			cTmp = 'I';
		else if (contem(cTmp, "õôóòö"))
			cTmp = 'o';
		else if (contem(cTmp, "ÕÔÓÒÖ"))
			cTmp = 'O';
		else if (contem(cTmp, "ûúùü"))
			cTmp = 'u';
		else if (contem(cTmp, "ÛÚÙÜ"))
			cTmp = 'U';
		else if (contem(cTmp, "ç"))
			cTmp = 'c';
		else if (contem(cTmp, "Ç"))
			cTmp = 'C';
		else if (contem(cTmp, "&"))
			cTmp = 'E';
		return cTmp;    
 
	}
	
	public static Date stringDDMMAAAAToDate( final String arg ) throws UtilException {

		Date retorno = null;

		try {
			if ( arg != null && arg.trim().length() > 7 ) {

				int dia = Integer.parseInt( arg.substring( 0, 2 ) );
				int mes = Integer.parseInt( arg.substring( 2, 4 ) );
				int ano = Integer.parseInt( arg.substring( 4 ) );

				if ( dia > 0 && mes > 0 && ano > 0 ) {
					retorno = FuncoesUtil.encodeDate( ano, mes, dia );
				}
			}
		} catch ( NumberFormatException e ) {
			throw new UtilException( "Erro na funcão stringToDate.\n" + e.getMessage() );
		}

		return retorno;
	}
	
	
	public static Date encodeDate(int iAno, int iMes, int iDia) {
		Date dtRetorno = new Date();
		GregorianCalendar gcSel = new GregorianCalendar();
		try {
			gcSel.setTime(dtRetorno);
			gcSel.set(Calendar.YEAR, iAno);
			gcSel.set(Calendar.MONTH, iMes - 1);
			gcSel.set(Calendar.DAY_OF_MONTH, iDia);
			dtRetorno = gcSel.getTime();
		}
		finally {
			gcSel = null;
		}
		return dtRetorno;
	}
	
	public static Date stringToDateDDMMAA( final String arg ) throws UtilException {

		Date retorno = null;
		Calendar cl = new GregorianCalendar();

		try {

			cl = Calendar.getInstance();

			if ( arg != null && arg.trim().length() > 5 ) {

				int dia = Integer.parseInt( arg.substring( 0, 2 ) );
				int mes = Integer.parseInt( arg.substring( 2, 4 ) );

				String anoatu = cl.get( Calendar.YEAR ) + "";

				int ano = Integer.parseInt( anoatu.substring( 0, 2 ) + arg.substring( 4 ) );

				if ( dia > 0 && mes > 0 && ano > 0 ) {
					retorno = encodeDate( ano, mes, dia );
				}
			}
		} catch ( NumberFormatException e ) {
			throw new UtilException( "Erro na função stringToDate.\n" + e.getMessage() );
		}

		return retorno;
	}
	
	// Remove formatado. Ex.: xx.xxx.xxx/xxxx-xx torna-se xxxxxxxxxxxxxx.
	public String noFormatCNPJ(String cnpj) {

		if (cnpj != null && !cnpj.equals(""))
			cnpj = cnpj.replaceAll("\\.", "").replaceAll("\\-", "")
					.replaceAll("/", "");
		return cnpj;

	}

	
	public synchronized static void mensagemInforma (String sMensagem) {
		//
	}
	
	public static Date stringToDateAAAAMMDD( final String arg ) throws UtilException {

		Date retorno = null;

		try {
			if ( arg != null && arg.trim().length() > 7 ) {

				int dia = Integer.parseInt( arg.substring( 6 ) );
				int mes = Integer.parseInt( arg.substring( 4, 6 ) );
				int ano = Integer.parseInt( arg.substring( 0, 4 ) );

				if ( dia > 0 && mes > 0 && ano > 0 ) {
					retorno = encodeDate( ano, mes, dia );
				}
			}
		} catch ( NumberFormatException e ) {
			throw new UtilException( "Erro na função stringToDate.\n" + e.getMessage() );
		}

		return retorno;
	}
	
	public static String LimpaString(String str, String strnew) {

		if (str == null) {
			return "";
		}

		StringBuilder validstring = new StringBuilder();

		validstring.append(str.replaceAll("\\W", strnew));

		return validstring.toString().trim();

	}
	
	public static String mensagemInformativa(String sMensagem) {
		
		return sMensagem;
		
	}
	
	public String noFormat(String texto) {

		if (texto != null && !texto.equals(""))
			texto = texto.replaceAll("\\.", "").replaceAll("\\-", "");
		return texto;

	}

}
